package Offer10_斐波那契数列;

/**
 * ---------------------------------------------------------------------------------------------
 * 题目：
 *      写一个函数，输入 n ，求斐波那契（Fibonacci）数列的第 n 项（即 F(N)）。斐波那契数列的定义如下：
 *      F(0) = 0,F(1)= 1
 *      F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
 *      斐波那契数列由 0 和 1 开始，之后的斐波那契数就是由之前的两数相加而得出。
 *      答案需要取模 1e9+7（1000000007），如计算初始结果为：1000000008，请返回 1。
 * ----------------------------------------------------------------------------------------------
 * 示例：
 *      输入：n = 2
 *      输出：1
 * -----------------------------------------------------------------------------------------------
 * 方法：
 *      方法1：递归（超时）
 *      方法2：迭代
 *      方法3：迭代的优化
 * -----------------------------------------------------------------------------------------------
 */
class Solution {
    public static void main(String[] args) {
        int n=2;
        System.out.println(fib1(n));
        System.out.println(fib2(n));
        System.out.println(fib3(n));
    }
    public static int fib1(int n) {
        if(n==0||n==1){
            return n;
        }
        return fib1(n-1)%1000000007+fib1(n-2)%1000000007;
    }
    public static int fib2(int n) {
        if(n==0){
            return 0;
        }
        int[] array = new int[n+1];
        array[0]=0;
        array[1]=1;
        for(int i=2;i<=n;++i){
            array[i]=array[i-1]+array[i-2];
            array[i]%=1000000007;
        }
        return array[n];
    }
    public static int fib3(int n) {
        if(n==0||n==1){
            return n;
        }
        int fn = 0;;
        int fn1 = 0;
        int fn2 = 1;
        for(int i=2;i<=n;++i){
            fn=(fn1+fn2)%1000000007;
            fn1=fn2;
            fn2=fn;
        }
        return fn;
    }
}